查看原文
其他

如何使用 .NET Core 安全地加/解密文件

My IO DotNet 2022-07-19
前言

由于客户网络安全限制,连接到互联网的设备不能访问内网。需要先从客户端应用中导出数据到文件,再将文件复制到U盘,最后通过内网机器上传数据。如何保证,在复制、传输过程中,文件的安全性?

思路

首先想到的是对文件进行加密。但是文件本身可能非常大,因此只能采取对称加密(AES)。如果将对称加密的密钥存储在客户端的应用里,可能导致密钥泄露。
最好是每次加密都使用不同的AES密钥。现在的关键是,如何将这个随机AES密钥传输给解密方?根据我们在《请收藏!这可能是目前最安全的数据加密传输解决方案》中的思路,我们可以采用RSA公钥加密AES密钥,并将其作为文件的一部分发给解密方。

加密文件将由以下几个部分组成

  • 256字节RSA加密后的AES密钥

  • 16字节初始化向量

  • AES加密的文件数据


解密方首先读取并使用RSA私钥解密出AES密钥,再用AES密钥解密出实际的文件数据。


实现


理清了思路,让我们来看一下实现。首先是加密代码:
(byte[] aesKey, byte[] aesIV) = AesHelper.Create();  
  
using (var origFileStream = File.OpenRead("原始文件"))  
{  
    using (var encryptFileStream = File.Create("加密文件"))  
    {   
        await encryptFileStream.WriteAsync(RSAHelper.Encrypt(aesKey));  
        await encryptFileStream.WriteAsync(aesIV);  
  
        using (var cryptoStream = AesHelper.CreateWriteStream(encryptFileStream, aesKey, aesIV))  
        {  
            await origFileStream.CopyToAsync(cryptoStream);  
        }  
    }  
}  

然后是解密代码:

using (var decryptFileStream = File.OpenRead("解密文件"))  
{  
    using (var encryptFileStream = File.OpenRead("加密文件"))  
    {  
        var aesKeyData = new byte[256];  
        await encryptFileStream.ReadAsync(aesKeyData, 0, aesKeyData.Length);  
        var aesKey = RSAHelper.Decrypt(aesKeyData);  
  
        var aesIVData = new byte[16];  
        await encryptFileStream.ReadAsync(aesIVData, 0, aesIVData.Length);  
        var aesIV = aesIVData;  
  
        using (var cryptoStream = AesHelper.CreateReadStream(encryptFileStream, aesKey, aesIV))  
        {  
            await cryptoStream.CopyToAsync(decryptFileStream);  
        }  
    }  
}  

结论

通过使用RSA+AES,同时保证了密钥和数据的安全性。如果你也碰到了类似需求,不妨试试本文的实现方案。

- EOF -

推荐阅读  点击标题可跳转
.NET 7 预览版 2 ,增强 RegEx 源生成器、SDK 改进ASP.NET Core 框架探索 主机搭建与运行(附有思维导图).NET Core 验证码 - LazyCaptcha自定义随机验证码和字体


看完本文有收获?请转发分享给更多人

推荐关注「DotNet」,提升.Net技能 

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存